<?php
/**
 * Core_View_Bar_Abstract
 * 
 * @author naspeh
 * @version $Id: Abstract.php 661 2008-06-16 10:38:02Z naspeh $
 */
abstract class Core_View_Bar_Abstract
{
    /**
     * По умолчанию
     *
     * @var string
     */
    protected $_default = null;
    /**
     * Имя
     *
     * @var string
     */
    protected $_name = null;
    /**
     * Форматы
     *
     * @var array
     */
    protected $_formats = array(
        'a' => '<a href ="%1$s">%2$s</a>',
        'b' => '<b>%2$s</b>'         
    );
    /**
     * Возвращает умолчание
     *
     * @return string
     */
    public function getDefault()
    {
        return $this->_default;
    }
    /**
     * Устанавливает умолчание
     *
     * @param string $string
     */
    public function setDefault($string)
    {
        $this->_default = (string) $string;
    }
    /**
     * Строит ссылку
     *
     * @param string $url
     * @return string|null
     */
    public function getLink($url)
    {
        $url = (string) $url;
        $url = trim($url, '/\\');
        $acl = Core_Acl::getRegisrty();
        if (false !== ($resource = Core_Table_Actions::fetchByUrl($url))) {
            $resource = new Core_Acl_Resource_Action($resource);
            $acl->active($resource);
            if ($acl->isAllowed(Core_Auth::get('id'), $resource)) {
                $url = '/' . $url;
                $title = $resource->desc;
                return array($url, $title);
            } 
        }
        return null;
    }
    /**
     * Форматирует
     *
     * @param array $params
     * @param string $tag
     * @return string
     */
    public function format(array $params, $tag = null)
    {
        if (!isset($tag)) {
            $tag = current($this->_formats);
        }
        
        if (isset($this->_formats[$tag])) {
            return vsprintf($this->_formats[$tag], $params);
        }
    }
    /**
     * Строит панель
     *
     * @return string
     */
    public function build($data = null)
    {
        if (!isset($data)) {
            $data = $this->getData();
        }
        if (null !== $this->getDefault()) {
            $data = array_merge(array($this->getDefault()), $data);
        }
        $result = array();
        foreach ($data as $key => $item) {
            if (is_array($item)) {
                $children = $this->build($item);
                $item = $key;
            }
            $tag = 'a';
            $url = $item;
            $matches = array();
            if (preg_match('/(\w+)\:(.*)/', $item, $matches)) {
                $tag = $matches[1];
                $url = $matches[2];
            }
            if (null !== ($link = $this->getLink($url))) {
                $item = $this->format($link, $tag);
                if (isset($children)) {
                    $item .= '<div class="prepend-1">' . $children . '</div>';
                }
                if (!empty($item)) {
                    $result[$url] = $item;
                }
            }
        }
        $result = implode($this->getSeparator(), $result);
        return $result;
    }
    /**
     * Возвращает набор Url
     *
     * @return array
     */
    public function getData()
    {
        return Core_Config::get('bar|' . $this->getName() . '|data');
    }
    /**
     * Возвращает разделитель
     *
     * @return string
     */
    public function getSeparator()
    {
        return Core_Config::get('bar|' . $this->getName() . '|separator');
    }
    /**
     * Возвращает имя
     *
     * @return string
     */
    public function getName()
    {
        if (is_null($this->_name)) {
            throw new Core_Exception('nameNotInstance');
        }
        return $this->_name;
    }
}